<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>new 一个对象及手动实现new</title>
	</head>
	<body>
		1.创建一个新对象；
		2.链接到原型（将构造函数的 prototype 赋值给新对象的 __proto__）；
		3.绑定this（构造函数中的this指向新对象并且调用构造函数）
		4.判断：如果返回值非对象，则返回创建的那个新对象，否则直接返回结果。

	</body>
	<script type="text/javascript">
		//实现一个自己的new:myNew
		function myNew() {
			//创建一个新对象
			let obj = {}; 
			//获得构造函数
			let con = [].shift.call(arguments); 
			//链接到原型（给obj这个新生对象的原型指向它的构造函数的原型）
			obj.__proto__ = con.prototype; 
			//绑定this
			let result = con.apply(obj, arguments); 
			// 确保new出来的是一个对象
			return typeof result === 'object' ? result : obj 
		}

		// 测试一下：
		function Person(name, age) {
			this.name = name;
		}
		let person1 = new Person("Curry", 18);
		let person2 = myNew(Person, "Curry", 18);

		console.log(person1)
		console.log(person2)
		//总结：打印结果是一样的，说明可行
	</script>
</html>
